AFLAGS	= 
LFLAGS	= -C javabin.cfg -m vm02.map
BINFILE	= vm02.bin
OBJS	= vm02.o memmgr.o codemgr.o strpool.o classclass.o sysclass.o string.o classload.o utils.o frame.o thread.o io.o ops.o except.o
LOADER	= java.system.sys
CLASSES	= apple2/vm02.class apple2/conio.class apple2/AppleStuff.class apple2/OutputConsole.class apple2/PrintConsole.class apple2/InputConsole.class apple2/ProDOS.class apple2/SystemException.class \
                  java/lang/Thread.class java/lang/System.class java/lang/Throwable.class java/lang/Error.class java/lang/ThreadDeath.class java/lang/VirtualMachineError.class java/lang/Exception.class \
                  java/lang/RuntimeException.class java/lang/InternalError.class java/lang/OutOfMemoryError.class java/lang/StackOverflowError.class java/lang/LinkeageError.class java/lang/NoClassDefFoundError.class \
                  java/lang/ClassFormatError.class java/lang/IncompatibleClassChangeError.class java/lang/NoSuchFieldError.class java/lang/NoSuchMethodError.class java/lang/ClassCastException.class \
                  java/lang/IllegalArgumentException.class java/lang/IllegalMonitorStateException.class java/lang/IllegalThreadStateException.class java/lang/ClassNotFoundException.class \
                  java/lang/InterruptedException.class java/lang/NullPointerException.class java/lang/IndexOutOfBoundsException.class java/lang/ArrayIndexOutOfBoundsException.class java/lang/StringIndexOutOfBoundsException.class \
                  java/lang/NegativeArraySizeException.class java/lang/ArrayStoreException.class java/lang/ArithmeticException.class \
                  java/io/OutputStream.class java/io/FilterOutputStream.class java/io/PrintStream.class java/io/InputStream.class

all: $(BINFILE) $(LOADER) $(CLASSES)

clean:
	rm $(BINFILE) $(OBJS) $(LOADER) loader.o $(CLASSES) apple2/vm02.o
	
$(LOADER): loader.s
	ca65 $(AFLAGS) $<
	ld65 -C loader.cfg loader.o -o $(LOADER)
    
$(BINFILE): $(OBJS)
	ld65 $(LFLAGS) $(OBJS) -o $(BINFILE)

vm02.o: vm02.s global.inc
	ca65 $(AFLAGS) $<

memmgr.o: memmgr.s global.inc
	ca65 $(AFLAGS) $<

codemgr.o: codemgr.s global.inc
	ca65 $(AFLAGS) $<

strpool.o: strpool.s global.inc
	ca65 $(AFLAGS) $<

thread.o: thread.s global.inc
	ca65 $(AFLAGS) $<

frame.o: frame.s global.inc frame.inc
	ca65 $(AFLAGS) $<

classclass.o: classclass.s global.inc
	ca65 $(AFLAGS) $<

sysclass.o: sysclass.s global.inc object.clasm array.clasm
	ca65 $(AFLAGS) $<

string.o: string.s global.inc string.clasm
	ca65 $(AFLAGS) $<

classload.o: classload.s global.inc
	ca65 $(AFLAGS) $<

ops.o: ops.s global.inc
	ca65 $(AFLAGS) $<

io.o: io.s global.inc
	ca65 $(AFLAGS) $<

except.o: except.s global.inc class.inc frame.inc
	ca65 $(AFLAGS) $<

utils.o: utils.s global.inc
	ca65 $(AFLAGS) $<
	
apple2/vm02.class: apple2/vm02.java apple2/vm02.clasm
	javac -g:none $<
	ca65 apple2/vm02.clasm
	ld65 -C clasm.cfg apple2/vm02.o -o apple2/VM02.BIN

apple2/conio.class: apple2/conio.java apple2/vm02.java
	javac -g:none $<
	cp apple2/conio.class apple2/CONIO.BIN

apple2/AppleStuff.class: apple2/AppleStuff.java apple2/vm02.java
	javac -g:none $<
	ca65 apple2/AppleStuff.clasm
	ld65 -C clasm.cfg apple2/AppleStuff.o -o apple2/APPLESTUFF.BIN

apple2/ProDOS.class: apple2/ProDOS.java apple2/vm02.java
	javac -g:none $<
	cp apple2/ProDOS.class apple2/PRODOS.BIN

apple2/SystemException.class: apple2/SystemException.java
	javac -g:none $<
	cp apple2/SystemException.class apple2/SYSTEMEXCEPTION.BIN

apple2/OutputConsole.class: apple2/OutputConsole.java java/io/OutputStream.java
	javac -g:none $<
	cp apple2/OutputConsole.class apple2/OUTPUTCONSOLE.BIN

apple2/PrintConsole.class: apple2/PrintConsole.java java/io/PrintStream.java
	javac -g:none $<
	cp apple2/PrintConsole.class apple2/PRINTCONSOLE.BIN

apple2/InputConsole.class: apple2/InputConsole.java java/io/InputStream.java
	javac -g:none $<
	cp apple2/InputConsole.class apple2/INPUTCONSOLE.BIN

java/lang/Thread.class: java/lang/Thread.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/Thread.class java/lang/THREAD.BIN

java/lang/System.class: java/lang/System.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/System.class java/lang/SYSTEM.BIN

java/lang/Throwable.class: java/lang/Throwable.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/Throwable.class java/lang/THROWABLE.BIN

java/lang/Error.class: java/lang/Error.java
	javac -g:none $<
	cp java/lang/Error.class java/lang/ERROR.BIN

java/lang/ThreadDeath.class: java/lang/ThreadDeath.java
	javac -g:none $<
	cp java/lang/ThreadDeath.class java/lang/THREADDEATH.BIN

java/lang/VirtualMachineError.class: java/lang/VirtualMachineError.java
	javac -g:none $<
	cp java/lang/VirtualMachineError.class java/lang/VIRTUALMACHINEERROR.BIN

java/lang/InternalError.class: java/lang/InternalError.java
	javac -g:none $<
	cp java/lang/InternalError.class java/lang/INTERNALERROR.BIN

java/lang/OutOfMemoryError.class: java/lang/OutOfMemoryError.java
	javac -g:none $<
	cp java/lang/OutOfMemoryError.class java/lang/OUTOFMEMORYERROR.BIN

java/lang/StackOverflowError.class: java/lang/StackOverflowError.java
	javac -g:none $<
	cp java/lang/StackOverflowError.class java/lang/STACKOVERFLOWERROR.BIN

java/lang/LinkeageError.class: java/lang/LinkeageError.java
	javac -g:none $<
	cp java/lang/LinkeageError.class java/lang/LINKEAGEERROR.BIN

java/lang/NoClassDefFoundError.class: java/lang/NoClassDefFoundError.java
	javac -g:none $<
	cp java/lang/NoClassDefFoundError.class java/lang/NOCLASSDEFFOUNDERROR.BIN

java/lang/ClassFormatError.class: java/lang/ClassFormatError.java
	javac -g:none $<
	cp java/lang/ClassFormatError.class java/lang/CLASSFORMATERROR.BIN

java/lang/IncompatibleClassChangeError.class: java/lang/IncompatibleClassChangeError.java
	javac -g:none $<
	cp java/lang/IncompatibleClassChangeError.class java/lang/INCOMPATIBLECLASSCHANGEERROR.BIN

java/lang/NoSuchFieldError.class: java/lang/NoSuchFieldError.java
	javac -g:none $<
	cp java/lang/NoSuchFieldError.class java/lang/NOSUCHFIELDERROR.BIN

java/lang/NoSuchMethodError.class: java/lang/NoSuchMethodError.java
	javac -g:none $<
	cp java/lang/NoSuchMethodError.class java/lang/NOSUCHMETHODERROR.BIN

java/lang/Exception.class: java/lang/Exception.java
	javac -g:none $<
	cp java/lang/Exception.class java/lang/EXCEPTION.BIN

java/lang/RuntimeException.class: java/lang/RuntimeException.java
	javac -g:none $<
	cp java/lang/RuntimeException.class java/lang/RUNTIMEEXCEPTION.BIN

java/lang/IllegalArgumentException.class: java/lang/IllegalArgumentException.java
	javac -g:none $<
	cp java/lang/IllegalArgumentException.class java/lang/ILLEGALARGUMENTEXCEPTION.BIN

java/lang/IllegalMonitorStateException.class: java/lang/IllegalMonitorStateException.java
	javac -g:none $<
	cp java/lang/IllegalMonitorStateException.class java/lang/ILLEGALMONITORSTATEEXCEPTION.BIN

java/lang/IllegalThreadStateException.class: java/lang/IllegalThreadStateException.java
	javac -g:none $<
	cp java/lang/IllegalThreadStateException.class java/lang/ILLEGALTHREADSTATEEXCEPTION.BIN

java/lang/ClassCastException.class: java/lang/ClassCastException.java
	javac -g:none $<
	cp java/lang/ClassCastException.class java/lang/CLASSCASTEXCEPTION.BIN

java/lang/InterruptedException.class: java/lang/InterruptedException.java
	javac -g:none $<
	cp java/lang/InterruptedException.class java/lang/INTERRUPTEDEXCEPTION.BIN

java/lang/ClassNotFoundException.class: java/lang/ClassNotFoundException.java
	javac -g:none $<
	cp java/lang/ClassNotFoundException.class java/lang/CLASSNOTFOUNDEXCEPTION.BIN

java/lang/NullPointerException.class: java/lang/NullPointerException.java
	javac -g:none $<
	cp java/lang/NullPointerException.class java/lang/NULLPOINTEREXCEPTION.BIN

java/lang/IndexOutOfBoundsException.class: java/lang/IndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/IndexOutOfBoundsException.class java/lang/INDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/ArrayIndexOutOfBoundsException.class: java/lang/ArrayIndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/ArrayIndexOutOfBoundsException.class java/lang/ARRAYINDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/StringIndexOutOfBoundsException.class: java/lang/StringIndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/StringIndexOutOfBoundsException.class java/lang/STRINGINDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/NegativeArraySizeException.class: java/lang/NegativeArraySizeException.java
	javac -g:none $<
	cp java/lang/NegativeArraySizeException.class java/lang/NEGATIVEARRAYSIZEEXCEPTION.BIN

java/lang/ArrayStoreException.class: java/lang/ArrayStoreException.java
	javac -g:none $<
	cp java/lang/ArrayStoreException.class java/lang/ARRAYEXCEPTION.BIN

java/lang/ArithmeticException.class: java/lang/ArithmeticException.java
	javac -g:none $<
	cp java/lang/ArithmeticException.class java/lang/ARITHMETICEXCEPTION.BIN

java/io/OutputStream.class: java/io/OutputStream.java
	javac -g:none $<
	cp java/io/OutputStream.class java/io/OUTPUTSTREAM.BIN

java/io/FilterOutputStream.class: java/io/FilterOutputStream.java java/io/OutputStream.java
	javac -g:none $<
	cp java/io/FilterOutputStream.class java/io/FILTEROUTPUTSTREAM.BIN

java/io/PrintStream.class: java/io/PrintStream.java java/io/FilterOutputStream.java
	javac -g:none $<
	cp java/io/PrintStream.class java/io/PRINTSTREAM.BIN

java/io/InputStream.class: java/io/InputStream.java
	javac -g:none $<
	cp java/io/InputStream.class java/io/INPUTSTREAM.BIN
